package com.woniuxy.controller;

import com.woniuxy.entity.AllMenu;
import com.woniuxy.entity.DTO.MenuQueryDTO;
import com.woniuxy.entity.VO.MenuVO;
import com.woniuxy.service.MenuService;
import com.woniuxy.util.PageResult;
import com.woniuxy.util.ResponseData;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @Author pml
 * @Date 2025/7/15 11:57
 * @Description 菜单控制器
 * 负责处理前端菜单相关的HTTP请求
 */
@RestController
@RequestMapping("/menu")
@Api(tags = "菜单管理")
public class MenuController {

    // 注入菜单服务层对象，用于业务逻辑处理
    @Autowired
    private MenuService menuService;

    /**
     * 获取侧边栏菜单数据
     * 前端通过此接口获取完整的菜单树结构
     * @return 包含菜单列表的统一响应对象
     * 响应类型从AllMenu改为MenuVO，以支持树形结构返回
     */
    @GetMapping("/getSideMenu")
    @ApiOperation(value = "获取侧边栏菜单", notes = "获取用户权限范围内的侧边栏菜单列表")
    public ResponseData<List<MenuVO>> getSideMenu() {
        // 调用服务层方法获取菜单数据，并通过ResponseData统一返回格式
        // 返回类型从List<AllMenu>改为List<MenuVO>
        List<MenuVO> menuList = menuService.getSideMenu();
        return ResponseData.ok(menuList);
    }

    /**
     * 分页多条件查询菜单列表
     * 用于后台管理系统的菜单列表展示，支持多条件筛选
     * @param queryDTO 查询条件和分页参数
     * @return 包含分页菜单列表的统一响应对象
     */
    @GetMapping("/list")
    @ApiOperation(value = "菜单分页列表", notes = "多条件分页查询菜单列表")
    public ResponseData<PageResult<AllMenu>> getMenuList(MenuQueryDTO queryDTO) {
        PageResult<AllMenu> pageResult = menuService.getMenuList(queryDTO);
        return ResponseData.ok(pageResult);
    }

    /**
     * 根据ID查询单个菜单
     * 用于菜单编辑时的数据回显
     * @param menuId 菜单ID
     * @return 包含菜单详情的统一响应对象
     */
    @GetMapping("/{menuId}")
    @ApiOperation(value = "查询菜单详情", notes = "根据ID查询单个菜单详情")
    public ResponseData<AllMenu> getMenuById(@PathVariable Integer menuId) {
        AllMenu menu = menuService.getById(menuId);
        return ResponseData.ok(menu);
    }

    /**
     * 新增菜单
     * 用于创建新菜单，支持创建顶级菜单和子菜单
     * @param menu 菜单信息
     * @return 操作结果的统一响应对象
     */
    @PostMapping
    @ApiOperation(value = "新增菜单", notes = "创建新菜单，parentId为null时创建顶级菜单")
    public ResponseData addMenu(@RequestBody AllMenu menu) {
        // 设置默认状态为启用
        if (menu.getStatus() == null) {
            menu.setStatus(1);
        }
        boolean success = menuService.saveMenu(menu);
        return success ? ResponseData.ok() : ResponseData.fail(500, "新增菜单失败");
    }

    /**
     * 更新菜单信息
     * 用于修改已有菜单的信息，不允许修改菜单ID
     * @param menu 菜单信息（必须包含menuId）
     * @return 操作结果的统一响应对象
     */
    @PutMapping
    @ApiOperation(value = "更新菜单", notes = "修改已有菜单信息")
    public ResponseData updateMenu(@RequestBody AllMenu menu) {
        if (menu.getMenuId() == null) {
            return ResponseData.fail(400, "菜单ID不能为空");
        }
        boolean success = menuService.updateMenu(menu);
        return success ? ResponseData.ok() : ResponseData.fail(500, "更新菜单失败");
    }

    /**
     * 根据ID删除菜单
     * 采用逻辑删除而非物理删除，避免误删导致数据丢失
     * @param menuId 菜单ID
     * @return 操作结果的统一响应对象
     */
    @DeleteMapping("/{menuId}")
    @ApiOperation(value = "删除菜单", notes = "根据ID删除菜单（逻辑删除）")
    public ResponseData deleteMenu(@PathVariable("menuId") Integer menuId) {
        boolean success = menuService.deleteMenu(menuId);
        return success ? ResponseData.ok() : ResponseData.fail(500, "删除菜单失败");
    }

    /**
     * 批量删除菜单
     * 使用DELETE请求，请求体传递菜单ID列表
     * 采用逻辑删除，与单个删除保持一致的业务逻辑
     */
    @DeleteMapping("/batch")
    @ApiOperation(value = "批量删除菜单", notes = "批量逻辑删除菜单（设置status=0）")
    public ResponseData batchDeleteMenu(@RequestBody List<Integer> menuIds) {
        // 调用批量逻辑删除方法，而非直接物理删除
        boolean success = menuService.batchDeleteMenu(menuIds);
        return success ? ResponseData.ok() : ResponseData.fail(500, "批量删除菜单失败");
    }
}